package com.flyxiaozhu.rabbitmqdemo;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class RabbitMqConfig {

    //  ---------------- direct 形式 -------------------
    // 定义两个direct使用的队列，不需要定义交换机，默认direct
    @Bean
    public Queue directQueue1() {
        return new Queue("direct-queue-1");
    }

    @Bean
    public Queue directQueue2() {
        return new Queue("direct-queue-2");
    }

    //  ---------------- fanout 形式 -------------------
    // 定义fanout类型交换机
    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanout-exchange");
    }

    // 定义fanout使用的两个队列，广播模式可使用AnonymousQueue队列
    @Bean
    public Queue fanoutQueue1() {
        // AnonymousQueue 这个类是代表一个匿名的 不耐用的 独占的 自动删除的队列
        return new AnonymousQueue();
    }

    @Bean
    public Queue fanoutQueue2() {
        return new AnonymousQueue();
    }

    // 交换机和队列进行绑定，通过参数名去匹配
    @Bean
    public Binding fanoutBinding1(FanoutExchange fanoutExchange, Queue fanoutQueue1) {
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }

    @Bean
    public Binding fanoutBinding2(FanoutExchange fanoutExchange, Queue fanoutQueue2) {
        return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
    }

    //  ---------------- topic 形式 -------------------
    // 定义topic类型交换机
    @Bean
    TopicExchange topicExchange() {
        return new TopicExchange("topic-exchange");
    }

    // 定义topic使用的两个队列
    @Bean
    public Queue topicQueue1() {
        return new Queue("topic.queue-1");
    }

    @Bean
    public Queue topicQueue2() {
        return new Queue("topic.queue-2");
    }

    // 交换机和队列进行绑定，通过参数名去匹配
    @Bean
    public Binding topicBinding1(TopicExchange topicExchange, Queue topicQueue1) {
        return BindingBuilder.bind(topicQueue1).to(topicExchange).with("topic.queue-1");
    }

    @Bean
    public Binding topicBinding2(TopicExchange topicExchange, Queue topicQueue2) {
        return BindingBuilder.bind(topicQueue2).to(topicExchange).with("topic.#");
    }

    //  ---------------- 消息确认测试 -------------------
    @Bean
    public Queue testQueue() {
        return new Queue("test-queue");
    }
}
